package com.google.appengine.codelab;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.datastore.Entity;

@SuppressWarnings("serial")
public class FraudesPorFronteiraServlet extends BaseServlet 
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		
		request.setAttribute("tipos", Fraude.listarTiposFraudes());
		
		if( "consultarTransacoes".equals(request.getParameter("op")) )
		{
			consultarFraudes(request, response);
		}
		else if( "gerarMapa".equals(request.getParameter("op")) )
		{
			gerarMapa(request, response);
		}
		else{

			request.getRequestDispatcher("/WEB-INF/jsp/frmFraudesPorFronteira.jsp").forward(request, response);
		}
	}

	protected void consultarFraudes(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		try{
			String dataInicialStr = request.getParameter("dataInicial");
			String dataFinalStr = request.getParameter("dataFinal");
			String tipoFraude = request.getParameter("tipo");

			request.setAttribute("dataInicial", dataInicialStr);
			request.setAttribute("dataFinal", dataFinalStr);
			request.setAttribute("tipoFraude", tipoFraude);
			
			Date dataInicial = Common.cDate(dataInicialStr);
			Date dataFinal = Common.cDate(dataFinalStr);
			
			if( dataInicial.after(dataFinal) ){
				throw new Exception("Data inválida.");
			}
						
			List<FraudePorFronteira> fraudes = Fraude.getFraudes(dataInicial, dataFinal, tipoFraude);
			
			if( fraudes.isEmpty() ){
				throw new Exception("Nenhuma fraude encontrada para a pesquisa.");
			}
			
			request.setAttribute("fraudes", fraudes );
		}
		catch( Exception e ){
			e.printStackTrace();
			request.setAttribute("erro", e.getMessage());
		}
		request.getRequestDispatcher("/WEB-INF/jsp/frmFraudesPorFronteira.jsp").forward(request, response);
	}
	
	protected void gerarMapa(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//try{
			String idFraude = request.getParameter("idFraude");
			String tipoFronteira = request.getParameter("tipoFronteira");
			String dataInicialStr = request.getParameter("dataInicial");
			String dataFinalStr = request.getParameter("dataFinal");
			String tipoFraude = request.getParameter("tipo");
			
			request.setAttribute("dataInicial", dataInicialStr);
			request.setAttribute("dataFinal", dataFinalStr);
			request.setAttribute("tipoFraude", tipoFraude);
			request.setAttribute("tipoFronteira",tipoFronteira);
			
			Date dataInicial = Common.cDate(dataInicialStr);
			Date dataFinal = Common.cDate(dataFinalStr);
			
			if( dataInicial.after(dataFinal) ){
				throw new RuntimeException("Data inválida.");
			}
			
			Map<String,List<Entity>> fraudesPorFronteira = Fraude.getFraudesPorFronteira(idFraude,tipoFronteira, tipoFraude, dataInicial, dataFinal);
			
			if( fraudesPorFronteira.isEmpty() ){
				throw new RuntimeException("Nenhuma fraude encontrada para a fronteira "+ tipoFronteira +".");
			}
			
			String locations = "";
			for( Entry<String,List<Entity>> entry : fraudesPorFronteira.entrySet() )
			{
				locations += "['"+ entry.getKey() + ", total de fraudes: "+ entry.getValue().size() +"'," + 
						entry.getValue().get(0).getProperty("localidade_latitude") +","+ 
						entry.getValue().get(0).getProperty("localidade_longitude") + ",'teste1','teste2'],";
			}
			request.setAttribute("locations", locations);

			String idTransacao = Fraude.getSingleFraude(idFraude).getProperty("trans_id").toString();
			Entity estabelecimento = Estabelecimento.getSingleEstabelecimento(Transacao.getSingleTransacao(idTransacao).getProperty("estabelecimento_id").toString());
			Entity localidadePrincipal = Localidade.getSingleLocalidade(estabelecimento.getProperty("localidade_id").toString());
			
			String fraudeSelecionada = "Fraude Selecionada: ID "+idFraude+", "+ localidadePrincipal.getProperty("localidade_address")+
					", CEP:"+localidadePrincipal.getProperty("localidade_zip")+
					", "+localidadePrincipal.getProperty("localidade_city")+
					", "+localidadePrincipal.getProperty("localidade_state")+
					", "+localidadePrincipal.getProperty("localidade_country");
			
			request.setAttribute("fraudeSelecionada", fraudeSelecionada);
			
			request.getRequestDispatcher("/WEB-INF/jsp/mapFraudesPorFronteira.jsp").forward(request, response);
//		}
//		catch( Exception e ){
//			logger.log(Level.WARNING, e.getMessage(), e);
//			request.setAttribute("erro", "Erro: " + e.getMessage());
//			request.getRequestDispatcher("/WEB-INF/jsp/frmFraudesPorFronteira.jsp").forward(request, response);
//		}
	}

	private static final Logger logger = Logger.getLogger(FraudePorFronteira.class.getCanonicalName());
	
	
}
